package main

import (
	"context"
	"fmt"
	"time"
)

func main8() {
	// 创建cancelCtx对象，以及取消函数cancelFunc
	cancel, cancelFunc := context.WithCancel(context.Background())

	// 将cancelCtx对象传入函数f1, 并启动子协程执行
	go f1(cancel)

	// 将同一个cancelCtx对象传入函数f2, 并启动子协程执行
	go f2(cancel)

	// 休眠3秒钟，保证子协程能够执行
	time.Sleep(3 * time.Second)

	// 调用取消函数
	cancelFunc()

	fmt.Println("调用取消函数")
	time.Sleep(1 * time.Second)
}

// 函数f1, 循环读取cancelCtx对象中的通道Done中的数据
func f1(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("f1终止")
			return
		default:
			fmt.Println("f1执行中")
			time.Sleep(1 * time.Second)
		}
	}
}

// 函数f2, 循环读取cancelCtx对象中的通道Done中的数据
func f2(ctx context.Context) {
	for {
		select {
		case <-ctx.Done():
			fmt.Println("f2终止")
			return
		default:
			fmt.Println("f2执行中")
			time.Sleep(1 * time.Second)
		}
	}
}
